home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
ashe-1.1
/
xform.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-15
|
34KB
|
1,113 lines
/**
*
* xform.c - (c) 1994 Copyright by John R. Punin
*
* ASHE
*
* This file has the routines to create the Form option menu.
*
* John R. Punin Jul - 24 - 1994
*
*/
#include "xhtml.h"
#include "xform.h"
#include "xheader.h"
#include "xfile.h"
static int ntype=0;
static int check=0;
static int multi=0;
static int selec=0;
MenuItem type_menu[] = {
{ "Text...", &xmPushButtonWidgetClass, 'T', NULL,NULL, form_text, 0, NULL},
{ "Hidden...", &xmPushButtonWidgetClass, 'H', NULL, NULL,form_text, 0, NULL},
{ "Password...", &xmPushButtonWidgetClass, 'P', NULL,NULL, form_text, 0, NULL},
{ "", &xmSeparatorWidgetClass, (char)NULL, NULL,NULL, NULL, (int)NULL,NULL},
{ "Checkbox...", &xmPushButtonWidgetClass, 'C', NULL, NULL, form_radio, 0, NULL},
{ "Radio...", &xmPushButtonWidgetClass, 'a', NULL,NULL, form_radio, 0, NULL},
{ "", &xmSeparatorWidgetClass, (char)NULL, NULL,NULL, NULL, (int)NULL,NULL},
{ "Reset...", &xmPushButtonWidgetClass, 'R', NULL,NULL, form_reset, 0, NULL},
{ "Submit...", &xmPushButtonWidgetClass, 'S', NULL,NULL, form_reset, 0, NULL},
NULL,
};
MenuItem form_menu[] = {
{ "Form...", &xmPushButtonWidgetClass, 'F', NULL,NULL, set_form, 0, NULL},
{ "Input", &xmCascadeButtonWidgetClass, 'I', NULL, NULL, 0, 0, type_menu},
{ "Select...", &xmPushButtonWidgetClass, 'S', NULL, NULL, form_select, 0, NULL},
{ "Option...", &xmPushButtonWidgetClass, 'O', NULL,NULL , form_option, 0, NULL},
{ "Textarea...", &xmPushButtonWidgetClass, 'T', NULL,NULL,form_textarea,0,NULL},
NULL,};
Widget
BuildPulldownMenu(Widget w, char *menu_title, char menu_mnemonic,
Boolean tear_off, MenuItem *items,HTMLED *he)
{
Widget PullDown, cascade, widget;
int i;
XmString str;
PullDown = XmCreatePulldownMenu(w,"pulldown", NULL,0);
if (tear_off)
XtVaSetValues(PullDown, XmNtearOffModel, XmTEAR_OFF_ENABLED, NULL);
str = XmStringCreateLocalized(menu_title);
cascade = XtVaCreateManagedWidget
(menu_title,xmCascadeButtonWidgetClass, w,
XmNsubMenuId, PullDown,
XmNlabelString,str,
XmNmnemonic, menu_mnemonic,
NULL);
XmStringFree(str);
/* Now add the menu items */
for(i=0; items[i].label != NULL; i++)
{
/* If subitems exists, create the pull-right menu by calling this
function recursively. Since the function returns a cascade button
the widget returned is used..
*/
if(items[i].subitems)
widget = BuildPulldownMenu(PullDown, items[i].label,
items[i].mnemonic, tear_off,
items[i].subitems,he);
else
widget = XtVaCreateManagedWidget(items[i].label, *items[i].class,
PullDown,NULL);
/* Whether the item is a real item or a cascade button with a menu
it can still have a mnemonic.
*/
if(items[i].mnemonic)
XtVaSetValues(widget,XmNmnemonic, items[i].mnemonic,NULL);
/* any item can have an accelerator, except cascade menus. But,
I don't worry about that */
if(items[i].accelerator)
{
str = XmStringCreateLocalized (items[i].accel_text);
XtVaSetValues(widget, XmNaccelerator,items[i].accelerator,
XmNacceleratorText, str, NULL);
XmStringFree(str);
}
else if(items[i].accel_text)
{
str = XmStringCreateLocalized (items[i].accel_text);
XtVaSetValues(widget,
XmNacceleratorText, str, NULL);
XmStringFree(str);
}
items[i].callback_data = (XtPointer)he;
if(items[i].callback)
XtAddCallback(widget,
(items[i].class == &xmToggleButtonWidgetClass) ?
XmNvalueChangedCallback : /*Toggle Button class */
XmNactivateCallback, /*PushButton class */
items[i].callback, items[i].callback_data);
}
return cascade;
}
void
set_form(Widget w, XtPointer client_data, XtPointer call_data)
{
HTMLED *he = (HTMLED *)client_data;
Widget dialog,optionmenu,label_form,name_box;
XmString label =
XmStringCreateLtoR("FORM \n",XmSTRING_DEFAULT_CHARSET);
XmString t =
XmStringCreateLtoR("Action (URL) : \n",XmSTRING_DEFAULT_CHARSET);
XmString clear =XmStringCreateSimple("Clear");
XmString method = XmStringCreateSimple("Method :");
XmString get =XmStringCreateSimple("Get");
XmString post =XmStringCreateSimple("Post");
XmString none =XmStringCreateSimple("None");
dialog = XmCreatePromptDialog(he->textarea,"Form_html",NULL,0);
XtVaSetValues(dialog,
XmNselectionLabelString,t,
XmNapplyLabelString,clear,NULL);
XmStringFree(clear); XmStringFree(t);
name_box = XmCreateForm(dialog,"namebox",NULL,0);
optionmenu = XmVaCreateSimpleOptionMenu(name_box,"option_menu",
method,'\0',0 /* initial menu selection */,option_cb,
XmVaPUSHBUTTON,get,'\0',NULL,NULL,
XmVaPUSHBUTTON,post,'\0',NULL,NULL,
XmVaPUSHBUTTON,none,'\0',NULL,NULL,
XmNuserData,he,
NULL);
XmStringFree(get); XmStringFree(post);
XmStringFree(none);XmStringFree(method);
label_form = XmCreateLabel(name_box,"label_form",NULL,0);
XtVaSetValues(label_form,XmNlabelString,label,NULL);
XmStringFree(label);
XtVaSetValues(optionmenu, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,label_form,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(label_form, XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtManageChild(optionmenu);
XtManageChild(label_form);
XtManageChild(name_box);
/* When the user types the Reference name, call form_name()... */
XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)form_name,(XtPointer)he);
/* If the user selects cancel, just detroy the dialog */
XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
/* Clear button is available */
XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
/* No help is available */
XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
XtManageChild(dialog);
XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
0,0,800,800,0,0);
}
void
form_name(Widget w, XtPointer client_data, XtPointer call_data)
{
XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data;
HTMLED *he = (HTMLED *)client_data;
XmTextPosition left=0,right=0;
int len,lsel = 0;
char *str,*str2, *value,*ssel = NULL;
he->last_command = FORM;
if(XmTextGetSelectionPosition(he->textarea,&left,&right))
{
if(right<=left)
left = right = XmTextGetInsertionPosition(he->textarea);
}
else
left = right = XmTextGetInsertionPosition(he->textarea);
if(left!=right)
{
ssel = XmTextGetSelection(he->textarea);
lsel = strlen(ssel);
}
if(cbs->value!=NULL)
{
XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value);
len = strlen(value);
str = XtMalloc(len+40);
}
str2 = XtMalloc(20);
if(he->method == GET)
strcpy(str2," METHOD=\"GET\"");
else if(he->method == POST)
strcpy(str2," METHOD=\"POST\"");
else
{
XtFree(str2);
str2=NULL;
}
if(left!=right)
{
XmTextInsert(he->textarea,right,"\n</FORM>");
if(str2)
sprintf(str,"\n<FORM ACTION=\"%s\" %s>\n ",value,str2);
else
sprintf(str,"\n<FORM ACTION=\"%s\">\n",value);
XmTextInsert(he->textarea,left,str);
XmTextSetInsertionPosition(he->textarea,left+strlen(str));
XtFree(str);
}
else
{
XtFree(str);
str = XtMalloc(50);
sprintf(str,"\n<FORM ACTION=\"%s\" ",value);
if(str2)
strcat(str,str2);
strcat(str,">\n\n</FORM>");
XmTextInsert(he->textarea,left,str);
XtFree(str); XtFree(str2);
XmTextSetInsertionPosition(he->textarea,left + strlen(str) - 8);
}
XtFree(ssel);
he->method = GET;
XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
}
void
option_cb(Widget w, XtPointer client_data, XtPointer call_data)
{
Widget parent = XtParent(w);
HTMLED *he;
int item_no = (int)client_data;
XtVaGetValues(parent,XmNuserData,&he,NULL);
he->method = item_no;
}
void
form_text(Widget w, XtPointer client_data, XtPointer call_data)
{
HTMLED *he = (HTMLED *)client_data;
Widget dialog,name_box,text_name,label_name;
Widget label_maxl,text_maxl,label_size,text_size,label_input;
XmString va = XmStringCreateSimple("Value :");
XmString na = XmStringCreateSimple("Name :");
XmString ml = XmStringCreateSimple("MaxLength :");
XmString si = XmStringCreateSimple("Size : ");
XmString label = get_label_input(w);
XmString clear = XmStringCreateSimple("Clear");
dialog = XmCreatePromptDialog(he->textarea,"Input_text",NULL,0);
XtVaSetValues(dialog,XmNselectionLabelString,va,
XmNapplyLabelString,clear,NULL);
XmStringFree(va);XmStringFree(clear);
name_box = XmCreateForm(dialog,"namebox",NULL,0);
label_name = XmCreateLabel(name_box,"label_name",NULL,0);
XtVaSetValues(label_name,XmNlabelString,na,NULL);
XmStringFree(na);
text_name = XmCreateText(name_box,"text_name",NULL,0);
label_size = XmCreateLabel(name_box,"label_size",NULL,0);
XtVaSetValues(label_size,XmNlabelString,si,NULL);
XmStringFree(si);
text_size = XmCreateText(name_box,"text_size",NULL,0);
label_maxl = XmCreateLabel(name_box,"label_maxl",NULL,0);
XtVaSetValues(label_maxl,XmNlabelString,ml,NULL);
XmStringFree(ml);
text_maxl = XmCreateText(name_box,"text_maxl",NULL,0);
label_input = XmCreateLabel(name_box,"label_input",NULL,0);
XtVaSetValues(label_input,XmNlabelString,label,NULL);
XmStringFree(label);
XtVaSetValues(text_name, XmNtopAttachment,XmATTACH_WIDGET,
XmNtopWidget, label_name,
XmNleftAttachment, XmATTACH_FORM,
XmNcolumns,26,
NULL);
XtManageChild(text_name);
XtVaSetValues(label_name, XmNtopAttachment,XmATTACH_WIDGET,
XmNtopWidget, text_size,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtManageChild(label_name);
XtVaSetValues(text_size, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,label_size,
XmNleftAttachment, XmATTACH_FORM,
XmNcolumns,12,
NULL);
XtVaSetValues(label_size, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,label_input,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(label_input, XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(text_maxl, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,label_maxl,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, text_size,
XmNcolumns,12,
NULL);
XtVaSetValues(label_maxl, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,label_input,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, label_size,
NULL);
XtManageChild(text_size);
XtManageChild(label_size);
XtManageChild(text_maxl);
XtManageChild(label_maxl);
XtManageChild(label_input);
XtManageChild(name_box);
/* When the user types the Value, call ok_input_text()... */
XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_input_text,(XtPointer)he);
/* If the user selects cancel, just detroy the dialog */
XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
/* Clear button is available */
XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
/* No help is available */
XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
/* verify if these fields are numbers */
XtAddCallback(text_size,XmNmodifyVerifyCallback,
(XtCallbackProc)check_number, (XtPointer)5);
XtAddCallback(text_maxl,XmNmodifyVerifyCallback,
(XtCallbackProc)check_number, (XtPointer)5);
XtManageChild(dialog);
XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
0,0,800,800,0,0);
}
void
ok_input_text(Widget w, XtPointer client_data, XtPointer call_data)
{
HTMLED *he = (HTMLED *)client_data;
XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data;
Widget dialog,name_box,text_size,text_name,text_maxl;
char *size,*name,*maxl,*value;
int lsize, lname,lmaxl;
int lvalue=0;
XmTextPosition left = XmTextGetInsertionPosition(he->textarea);
char *inputcom = NULL;
dialog = XtNameToWidget(XtParent(w),"Input_text");
if(!dialog) dialog = XtNameToWidget(XtParent(w),"Input_check");
name_box = (dialog ? XtNameToWidget(dialog,"namebox"): NULL);
text_size = (name_box ? XtNameToWidget(name_box,"text_size") : NULL);
text_name = (name_box ? XtNameToWidget(name_box,"text_name") : NULL);
text_maxl = (name_box ? XtNameToWidget(name_box,"text_maxl") : NULL);
size = (text_size ? XmTextGetString(text_size) : NULL);
name = (text_name ? XmTextGetString(text_name) : NULL);
maxl = (text_maxl ? XmTextGetString(text_maxl) : NULL);
value=NULL;
lsize = (size ? strlen(size) : 0);
lname = (name ? strlen(name): 0);
lmaxl= (maxl ? strlen(maxl): 0);
if(cbs->value)
XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value);
lvalue = (value ? strlen(value): 0);
inputcom=XtMalloc(lsize+lname+lmaxl+lvalue+80);
he->last_command = INPUT;
sprintf(inputcom,"<INPUT type=\"%s",type_menu[ntype].label);
inputcom[13]=inputcom[13]+32; /* convert to lower case */
inputcom[strlen(inputcom)-3]='\0';
strcat(inputcom,"\" ");
ntype = 0;
if(lname!=0)
{
strcat(inputcom," name=\"");
strcat(inputcom,name);
strcat(inputcom,"\"");
}
if(lvalue!=0)
{
strcat(inputcom," value=\"");
strcat(inputcom,value);
strcat(inputcom,"\"");
}
if(lsize!=0)
{
strcat(inputcom," size=");
strcat(inputcom,size);
}
if(lmaxl!=0)
{
strcat(inputcom," maxlength=");
strcat(inputcom,maxl);
}
if(check!=0)
strcat(inputcom," checked");
strcat(inputcom,">\n");
XmTextInsert(he->textarea,left,inputcom);
XmTextSetInsertionPosition(he->textarea,left+strlen(inputcom));
XtFree(inputcom);XtFree(size);XtFree(name);XtFree(maxl);
XtFree(value);
check = 0;
XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
}
void
form_radio(Widget w, XtPointer client_data, XtPointer call_data)
{
HTMLED *he = (HTMLED *)client_data;
Widget dialog,name_box,text_name,label_name;
Widget checked,label_input;
XmString va = XmStringCreateSimple("Value :");
XmString na = XmStringCreateSimple("Name :");
XmString label = get_label_input(w);
XmString clear = XmStringCreateSimple("Clear");
dialog = XmCreatePromptDialog(he->textarea,"Input_check",NULL,0);
XtVaSetValues(dialog,XmNselectionLabelString,va,
XmNapplyLabelString,clear,NULL);
XmStringFree(va); XmStringFree(clear);
name_box = XmCreateForm(dialog,"namebox",NULL,0);
label_name = XmCreateLabel(name_box,"label_name",NULL,0);
XtVaSetValues(label_name,XmNlabelString,na,NULL);
XmStringFree(na);
text_name = XmCreateText(name_box,"text_name",NULL,0);
checked = XmCreateToggleButton(name_box,"Checked",NULL,0);
label_input = XmCreateLabel(name_box,"label_input",NULL,0);
XtVaSetValues(label_input,XmNlabelString,label,NULL);
XmStringFree(label);
XtVaSetValues(text_name, XmNtopAttachment,XmATTACH_WIDGET,
XmNtopWidget, label_name,
XmNleftAttachment, XmATTACH_FORM,
XmNcolumns,26,
NULL);
XtManageChild(text_name);
XtVaSetValues(label_name, XmNtopAttachment,XmATTACH_WIDGET,
XmNtopWidget, checked,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtManageChild(label_name);
XtVaSetValues(checked, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,label_input,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(label_input, XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtManageChild(checked);
XtManageChild(label_input);
XtManageChild(name_box);
/* When the user types the Value, call ok_input_text()... */
XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_input_text,(XtPointer)he);
/* If the user selects cancel, just detroy the dialog */
XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
/* Clear button is available */
XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
/* No help is available */
XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
/* Callback of Check button */
XtAddCallback(checked,XmNvalueChangedCallback,(XtCallbackProc)checked_input,NULL);
XtManageChild(dialog);
XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
0,0,800,800,0,0);
}
void
form_reset(Widget w, XtPointer client_data, XtPointer call_data)
{
HTMLED *he = (HTMLED *)client_data;
Widget dialog,label_input;
XmString label = get_label_input(w);
XmString clear = XmStringCreateSimple("Clear");
XmString va = XmStringCreateSimple("Value :");
dialog = XmCreatePromptDialog(he->textarea,"Input_check",NULL,0);
XtVaSetValues(dialog,XmNselectionLabelString,va,
XmNapplyLabelString,clear,NULL);
XmStringFree(va); XmStringFree(clear);
label_input = XmCreateLabel(dialog,"label_input",NULL,0);
XtVaSetValues(label_input,XmNlabelString,label,NULL);
XmStringFree(label);
XtManageChild(label_input);
/* When the user types the Value, call ok_input_text()... */
XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_input_text,(XtPointer)he);
/* If the user selects cancel, just detroy the dialog */
XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
/* Clear button is available */
XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
/* No help is available */
XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
XtManageChild(dialog);
XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
0,0,800,800,0,0);
}
void
form_select(Widget w, XtPointer client_data, XtPointer call_data)
{
HTMLED *he = (HTMLED *)client_data;
Widget dialog,name_box,text_size,label_size;
Widget multiple,label_select;
XmString si = XmStringCreateSimple("Size :");
XmString na = XmStringCreateSimple("Name :");
XmString label=XmStringCreateLtoR("Select Field\n",XmSTRING_DEFAULT_CHARSET);
XmString clear = XmStringCreateSimple("Clear");
dialog = XmCreatePromptDialog(he->textarea,"Select_field",NULL,0);
XtVaSetValues(dialog,XmNselectionLabelString,na,
XmNapplyLabelString,clear,NULL);
XmStringFree(na); XmStringFree(clear);
name_box = XmCreateForm(dialog,"namebox",NULL,0);
label_size = XmCreateLabel(name_box,"label_size",NULL,0);
XtVaSetValues(label_size,XmNlabelString,si,NULL);
XmStringFree(si);
text_size = XmCreateText(name_box,"text_size",NULL,0);
multiple = XmCreateToggleButton(name_box,"Multiple",NULL,0);
label_select = XmCreateLabel(name_box,"label_select",NULL,0);
XtVaSetValues(label_select,XmNlabelString,label,NULL);
XmStringFree(label);
XtVaSetValues(text_size, XmNtopAttachment,XmATTACH_WIDGET,
XmNtopWidget, label_size,
XmNleftAttachment, XmATTACH_FORM,
XmNcolumns,12,
NULL);
XtManageChild(text_size);
XtVaSetValues(label_size, XmNtopAttachment,XmATTACH_WIDGET,
XmNtopWidget, multiple,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtManageChild(label_size);
XtVaSetValues(multiple, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,label_select,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(label_select, XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtManageChild(multiple);
XtManageChild(label_select);
XtManageChild(name_box);
/* When the user types the Value, call ok_input_text()... */
XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_select,(XtPointer)he);
/* If the user selects cancel, just detroy the dialog */
XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
/* Clear button is available */
XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
/* No help is available */
XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
/* Callback of Multiple button */
XtAddCallback(multiple,XmNvalueChangedCallback,(XtCallbackProc)multiple_select,NULL);
/* verify if these fields are numbers */
XtAddCallback(text_size,XmNmodifyVerifyCallback,
(XtCallbackProc)check_number, (XtPointer)5);
XtManageChild(dialog);
XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
0,0,800,800,0,0);
}
void
ok_select(Widget w, XtPointer client_data, XtPointer call_data)
{
XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data;
HTMLED *he = (HTMLED *)client_data;
XmTextPosition left=0,right=0;
int len,lsel = 0;
char *str, *name=NULL,*ssel = NULL;
Widget dialog = XtNameToWidget(XtParent(w),"Select_field");
Widget name_box = (dialog ? XtNameToWidget(dialog,"namebox"): NULL);
Widget text_size = (name_box ? XtNameToWidget(name_box,"text_size") : NULL);
char *size = (text_size ? XmTextGetString(text_size) : NULL);
int lsize = (size ? strlen(size) : 0);
he->last_command = FORM;
if(XmTextGetSelectionPosition(he->textarea,&left,&right))
{
if(right<=left)
left = right = XmTextGetInsertionPosition(he->textarea);
}
else
left = right = XmTextGetInsertionPosition(he->textarea);
if(left!=right)
{
ssel = XmTextGetSelection(he->textarea);
lsel = strlen(ssel);
}
if(cbs->value!=NULL)
{
XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&name);
len = strlen(name);
str = XtMalloc(len+40);
}
if(left!=right)
{
XmTextInsert(he->textarea,right,"\n</SELECT>");
sprintf(str,"\n<SELECT name=\"%s\"",name);
if(lsize != 0)
{
strcat(str," size=");
strcat(str,size);
}
if(multi!=0)
strcat(str," multiple");
strcat(str,">\n");
XmTextInsert(he->textarea,left,str);
XmTextSetInsertionPosition(he->textarea,left+strlen(str));
XtFree(str);
}
else
{
XtFree(str);
str = XtMalloc(50);
sprintf(str,"\n<SELECT name=\"%s\"",name);
if(lsize != 0)
{
strcat(str," size=");
strcat(str,size);
}
if(multi!=0)
strcat(str," multiple");
strcat(str,">\n\n</SELECT>");
XmTextInsert(he->textarea,left,str);
XtFree(str);
XmTextSetInsertionPosition(he->textarea,left + strlen(str) - 10);
}
XtFree(ssel);
multi=0;
XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
}
void
form_option(Widget w, XtPointer client_data, XtPointer call_data)
{
HTMLED *he = (HTMLED *)client_data;
Widget dialog,name_box;
Widget selected,label_option;
XmString va = XmStringCreateSimple("Value :");
XmString label=XmStringCreateLtoR("Option Field\n",XmSTRING_DEFAULT_CHARSET);
XmString clear = XmStringCreateSimple("Clear");
dialog = XmCreatePromptDialog(he->textarea,"Option_field",NULL,0);
XtVaSetValues(dialog,XmNselectionLabelString,va,
XmNapplyLabelString,clear,NULL);
XmStringFree(va); XmStringFree(clear);
name_box = XmCreateForm(dialog,"namebox",NULL,0);
selected = XmCreateToggleButton(name_box,"Selected",NULL,0);
label_option = XmCreateLabel(name_box,"label_option",NULL,0);
XtVaSetValues(label_option,XmNlabelString,label,NULL);
XmStringFree(label);
XtVaSetValues(selected, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,label_option,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(label_option, XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtManageChild(selected);
XtManageChild(label_option);
XtManageChild(name_box);
/* When the user types the Value, call ok_input_text()... */
XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_option,(XtPointer)he);
/* If the user selects cancel, just detroy the dialog */
XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
/* Clear button is available */
XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
/* No help is available */
XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
/* Callback of Multiple button */
XtAddCallback(selected,XmNvalueChangedCallback,(XtCallbackProc)selected_check,NULL);
XtManageChild(dialog);
XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
0,0,800,800,0,0);
}
void
ok_option(Widget w, XtPointer client_data, XtPointer call_data)
{
HTMLED *he = (HTMLED *)client_data;
XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data;
int lvalue=0;
XmTextPosition left = XmTextGetInsertionPosition(he->textarea);
char *optioncom = NULL;
char *value=NULL;
if(cbs->value)
XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value);
lvalue = (value ? strlen(value): 0);
optioncom=XtMalloc(lvalue+30);
he->last_command = OPTION;
strcpy(optioncom,"<OPTION ");
if(lvalue!=0)
{
strcat(optioncom," value=\"");
strcat(optioncom,value);
strcat(optioncom,"\"");
}
if(selec!=0)
strcat(optioncom," selected");
strcat(optioncom,"> ");
XmTextInsert(he->textarea,left,optioncom);
XmTextSetInsertionPosition(he->textarea,left+strlen(optioncom));
XtFree(optioncom);
XtFree(value);
selec = 0;
XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
}
void
form_textarea(Widget w, XtPointer client_data, XtPointer call_data)
{
HTMLED *he = (HTMLED *)client_data;
Widget dialog,name_box;
Widget label_cols,text_cols,label_rows,text_rows,label_textarea;
XmString va = XmStringCreateSimple("Name :");
XmString ro = XmStringCreateSimple("Rows :");
XmString cl = XmStringCreateSimple("Cols : ");
XmString label =
XmStringCreateLtoR("Textarea Field\n",XmSTRING_DEFAULT_CHARSET);
XmString clear = XmStringCreateSimple("Clear");
dialog = XmCreatePromptDialog(he->textarea,"Textarea_field",NULL,0);
XtVaSetValues(dialog,XmNselectionLabelString,va,
XmNapplyLabelString,clear,NULL);
XmStringFree(va);XmStringFree(clear);
name_box = XmCreateForm(dialog,"namebox",NULL,0);
label_cols = XmCreateLabel(name_box,"label_cols",NULL,0);
XtVaSetValues(label_cols,XmNlabelString,cl,NULL);
XmStringFree(cl);
text_cols = XmCreateText(name_box,"text_cols",NULL,0);
label_rows = XmCreateLabel(name_box,"label_rows",NULL,0);
XtVaSetValues(label_rows,XmNlabelString,ro,NULL);
XmStringFree(ro);
text_rows = XmCreateText(name_box,"text_rows",NULL,0);
label_textarea = XmCreateLabel(name_box,"label_textarea",NULL,0);
XtVaSetValues(label_textarea,XmNlabelString,label,NULL);
XmStringFree(label);
XtVaSetValues(text_cols, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,label_cols,
XmNleftAttachment, XmATTACH_FORM,
XmNcolumns,12,
NULL);
XtVaSetValues(label_cols, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,label_textarea,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(label_textarea, XmNtopAttachment, XmATTACH_FORM,
XmNleftAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(text_rows, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,label_rows,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, text_cols,
XmNcolumns,12,
NULL);
XtVaSetValues(label_rows, XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget,label_textarea,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, label_cols,
NULL);
XtManageChild(text_cols);
XtManageChild(label_cols);
XtManageChild(text_rows);
XtManageChild(label_rows);
XtManageChild(label_textarea);
XtManageChild(name_box);
/* When the user types the Value, call ok_input_text()... */
XtAddCallback(dialog,XmNokCallback,(XtCallbackProc)ok_textarea,(XtPointer)he);
/* If the user selects cancel, just detroy the dialog */
XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
/* Clear button is available */
XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
/* No help is available */
XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
/* verify if these fields are numbers */
XtAddCallback(text_cols,XmNmodifyVerifyCallback,
(XtCallbackProc)check_number, (XtPointer)5);
XtAddCallback(text_rows,XmNmodifyVerifyCallback,
(XtCallbackProc)check_number, (XtPointer)5);
XtManageChild(dialog);
XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
0,0,800,800,0,0);
}
void
ok_textarea(Widget w, XtPointer client_data, XtPointer call_data)
{
XmSelectionBoxCallbackStruct *cbs=(XmSelectionBoxCallbackStruct *)call_data;
HTMLED *he = (HTMLED *)client_data;
XmTextPosition left=0,right=0;
int len,lsel = 0;
char *str, *name=NULL,*ssel = NULL;
Widget dialog = XtNameToWidget(XtParent(w),"Textarea_field");
Widget name_box = (dialog ? XtNameToWidget(dialog,"namebox"): NULL);
Widget text_cols = (name_box ? XtNameToWidget(name_box,"text_cols") : NULL);
Widget text_rows = (name_box ? XtNameToWidget(name_box,"text_rows") : NULL);
char *cols = (text_cols ? XmTextGetString(text_cols) : NULL);
char *rows = (text_rows ? XmTextGetString(text_rows) : NULL);
int lrows = (rows ? strlen(rows) : 0);
int lcols = (cols ? strlen(cols) : 0);
he->last_command = TEXTAREA;
if(XmTextGetSelectionPosition(he->textarea,&left,&right))
{
if(right<=left)
left = right = XmTextGetInsertionPosition(he->textarea);
}
else
left = right = XmTextGetInsertionPosition(he->textarea);
if(left!=right)
{
ssel = XmTextGetSelection(he->textarea);
lsel = strlen(ssel);
}
if(cbs->value!=NULL)
{
XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&name);
len = strlen(name);
str = XtMalloc(len+40);
}
if(left!=right)
{
XmTextInsert(he->textarea,right,"\n</TEXTAREA>");
sprintf(str,"\n<TEXTAREA name=\"%s\"",name);
if(lcols != 0)
{
strcat(str," cols=");
strcat(str,cols);
}
if(lrows != 0)
{
strcat(str," rows=");
strcat(str,rows);
}
strcat(str,">\n");
XmTextInsert(he->textarea,left,str);
XmTextSetInsertionPosition(he->textarea,left+strlen(str));
XtFree(str);
}
else
{
XtFree(str);
str = XtMalloc(50);
sprintf(str,"\n<TEXTAREA name=\"%s\"",name);
if(lcols != 0)
{
strcat(str," cols=");
strcat(str,cols);
}
if(lrows != 0)
{
strcat(str," rows=");
strcat(str,rows);
}
strcat(str,">\n\n</TEXTAREA>");
XmTextInsert(he->textarea,left,str);
XtFree(str);
XmTextSetInsertionPosition(he->textarea,left + strlen(str) - 12);
}
XtFree(ssel);
XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
}
XmString
get_label_input(Widget w)
{
XmString str;
char typein[30];
int i;
strcpy(typein, "Input Type : ");
for(i=0;type_menu[i].label != NULL;i++)
if(!strcmp(XtName(w),type_menu[i].label))
{
strcat(typein,type_menu[i].label);
strcat(typein,"\n");
str = XmStringCreateLtoR(typein,XmSTRING_DEFAULT_CHARSET);
ntype = i;
return str;
}
return str;
}
void
check_number(Widget text_w, XtPointer client_data, XtPointer call_data)
{
char c;
int ml = (int)client_data;
int len = XmTextGetLastPosition(text_w);
XmTextVerifyCallbackStruct *cbs =(XmTextVerifyCallbackStruct *)call_data;
if(cbs->reason == XmCR_MOVING_INSERT_CURSOR)
{
if(cbs->newInsert != len)
cbs->doit = False;
return;
}
/* no backspacing, typing or stuffing in middle of string */
if(cbs->currInsert < len)
{
cbs->doit = False;
return;
}
if(cbs->text->length == 0)
return;
if(cbs->text->length > 1)
{
cbs->doit = False;
return;
}
if(!isdigit(c=cbs->text->ptr[0]) || len >= ml)
{
cbs->doit = False;
XBell(XtDisplay(text_w),100);
}
}
void
checked_input(Widget w, XtPointer client_data, XtPointer call_data)
{
if(check == 0)
check = 1;
else
check = 0;
}
void
multiple_select(Widget w, XtPointer client_data, XtPointer call_data)
{
if(multi == 0)
multi = 1;
else
multi = 0;
}
void
selected_check(Widget w, XtPointer client_data, XtPointer call_data)
{
if(selec == 0)
selec = 1;
else
selec = 0;
}